package org.Yiran.timetale_re.item.tool.screwdriver.modules.type;

import net.minecraft.tags.BlockTags;
import net.minecraft.world.item.Tier;
import net.minecraft.world.level.block.state.BlockState;
import org.Yiran.timetale_re.item.tool.screwdriver.modules.IModule;
import org.Yiran.timetale_re.item.tool.screwdriver.modules.enmu.ModuleCategory;
import org.Yiran.timetale_re.item.tool.screwdriver.modules.enmu.ModuleType;

/**
 * 挖掘模块接口
 * <p>
 * 定义挖掘模块的通用功能
 * </p>
 */
public interface MiningModule extends IModule {
    
    /**
     * 获取挖掘等级
     *
     * @return 挖掘等级
     */
    int getHarvestLevel();
    
    /**
     * 获取工具类型
     *
     * @return 工具类型数组
     */
    String[] getToolTypes();
    
    /**
     * 检查是否可以挖掘指定方块
     *
     * @param state 方块状态
     * @return 是否可以挖掘
     */
    default boolean canHarvest(BlockState state) {
        // 默认实现：检查工具类型是否匹配方块类型
        for (String toolType : getToolTypes()) {
            if (isCorrectToolForBlock(toolType, state)) {
                return true;
            }
        }
        return false;
    }
    
    /**
     * 检查工具类型是否适用于指定方块
     *
     * @param toolType 工具类型
     * @param state    方块状态
     * @return 是否适用
     */
    default boolean isCorrectToolForBlock(String toolType, BlockState state) {
        return switch (toolType) {
            case "pickaxe" -> state.is(BlockTags.MINEABLE_WITH_PICKAXE);
            case "axe" -> state.is(BlockTags.MINEABLE_WITH_AXE);
            case "shovel" -> state.is(BlockTags.MINEABLE_WITH_SHOVEL);
            default -> false;
        };
    }
    
    /**
     * 获取挖掘速度
     *
     * @param state 方块状态
     * @return 挖掘速度
     */
    default float getDestroySpeed(BlockState state) {
        // 根据工具类型和方块类型返回相应的挖掘速度
        for (String toolType : getToolTypes()) {
            if (isCorrectToolForBlock(toolType, state)) {
                return getTier().getSpeed();
            }
        }
        return 1.0f;
    }
    
    /**
     * 获取工具等级
     *
     * @return 工具等级
     */
    Tier getTier();
    
    /**
     * 获取模块类型
     *
     * @return 模块类型
     */
    @Override
    default ModuleType getModuleType() {
        return ModuleType.MINING;
    }
    
    /**
     * 获取模块分类
     *
     * @return 模块分类
     */
    @Override
    default ModuleCategory getModuleCategory() {
        return IModule.super.getModuleCategory();
    }
}